package cn.edu.zut.qixiang.mock;

import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

/**
 * 水文数据采集表数据生成器
 * 为水文数据采集站生成模拟数据（每隔10分钟采集一次）
 * @author 86178
 */
public class PrecipitationDataGenerator {

    // 数据库配置
    private static final String URL = "jdbc:mysql://localhost:3306/qixiang_base?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
    private static final String USER = "root";
    private static final String PASSWORD = "520521fcf..@1234";

    // 数据生成参数
    private static final int BATCH_SIZE = 100;
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) {
        generatePrecipitationData();
    }

    /**
     * 生成水文数据（每隔10分钟采集一次）
     */
    public static void generatePrecipitationData() {
        String selectStationsSql = "SELECT station_id FROM collection_stations WHERE station_type = '水文数据采集站' ORDER BY station_id";
        String insertDataSql = "INSERT INTO precipitation_data (collection_station_id, precipitation, collection_time) VALUES (?, ?, ?)";

        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement selectStmt = conn.prepareStatement(selectStationsSql);
             PreparedStatement insertStmt = conn.prepareStatement(insertDataSql)) {

            conn.setAutoCommit(false);
            Random random = new Random();

            // 获取所有水文数据采集站
            ResultSet stationRs = selectStmt.executeQuery();

            int batchCount = 0;
            int totalRecords = 0;
            int stationCount = 0;

            // 生成2025年5月1日到9月1日的数据，每10分钟一次
            LocalDateTime startTime = LocalDateTime.of(2025, 5, 1, 0, 0, 0);
            LocalDateTime endTime = LocalDateTime.of(2025, 9, 1, 23, 50, 0);

            System.out.println("开始生成水文数据...");
            System.out.println("时间范围: " + startTime.format(DATE_FORMATTER) + " 到 " + endTime.format(DATE_FORMATTER));
            System.out.println("采集频率: 每10分钟一次");

            // 遍历每个水文采集站
            while (stationRs.next()) {
                int stationId = stationRs.getInt("station_id");
                stationCount++;
                System.out.println("为采集站 " + stationId + " 生成数据...");

                LocalDateTime currentTime = startTime;

                // 为每个时间点生成数据（每10分钟一次）
                while (!currentTime.isAfter(endTime)) {
                    // 生成降水量数据（大部分时间为0，模拟无降水情况）
                    double precipitation = generatePrecipitation(currentTime, random);

                    // 设置插入参数
                    insertStmt.setInt(1, stationId);
                    insertStmt.setDouble(2, precipitation);
                    insertStmt.setString(3, currentTime.format(DATE_FORMATTER));

                    insertStmt.addBatch();
                    batchCount++;
                    totalRecords++;

                    // 批量提交
                    if (batchCount % BATCH_SIZE == 0) {
                        insertStmt.executeBatch();
                        conn.commit();
                        System.out.println("已提交 " + batchCount + " 条记录，总计 " + totalRecords + " 条");
                    }

                    // 时间增加10分钟
                    currentTime = currentTime.plusMinutes(10);
                }
            }

            // 提交剩余数据
            if (batchCount % BATCH_SIZE != 0) {
                insertStmt.executeBatch();
                conn.commit();
            }

            System.out.println("水文数据生成完成！");
            System.out.println("共为 " + stationCount + " 个采集站生成 " + totalRecords + " 条记录");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成降水量数据
     * 模拟真实的降水模式：大部分时间无降水，偶尔有降水事件
     */
    private static double generatePrecipitation(LocalDateTime time, Random random) {
        int month = time.getMonthValue();
        int hour = time.getHour();

        // 根据不同月份设置降水概率（夏季降水概率更高）
        double precipitationProbability;
        switch (month) {
            case 5: // 5月
                precipitationProbability = 0.05;
                break;
            case 6: // 6月
                precipitationProbability = 0.08;
                break;
            case 7: // 7月
                precipitationProbability = 0.12;
                break;
            case 8: // 8月
                precipitationProbability = 0.10;
                break;
            case 9: // 9月
                precipitationProbability = 0.06;
                break;
            default:
                precipitationProbability = 0.03;
        }

        // 下午和晚上降水概率稍高
        if (hour >= 14 && hour <= 20) {
            precipitationProbability *= 1.5;
        }

        // 大部分时间无降水
        if (random.nextDouble() > precipitationProbability) {
            return 0.0;
        }

        // 生成降水强度（mm/10分钟）
        // 小雨: 0-0.5mm, 中雨: 0.5-2mm, 大雨: 2-5mm
        double precipitationIntensity = random.nextDouble();
        if (precipitationIntensity < 0.7) {
            // 小雨
            return Math.round(random.nextDouble() * 0.5 * 100) / 100.0;
        } else if (precipitationIntensity < 0.9) {
            // 中雨
            return Math.round((0.5 + random.nextDouble() * 1.5) * 100) / 100.0;
        } else {
            // 大雨
            return Math.round((2.0 + random.nextDouble() * 3.0) * 100) / 100.0;
        }
    }
}